From eeae2c03995def031d3d3b72a4d3c6272d98a040 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Wed, 7 Nov 2007 10:10:20 -0700 Subject: [PATCH] [IA64] vti save-restore: reap ioreq after resume. Otherwise ioreq is left as STATE_IORESP_READY so that the domain will be paniced. Signed-off-by: Isaku Yamahata --- xen/arch/ia64/vmx/vmx_init.c | 27 ++++++++++++++++++++++++++- xen/arch/ia64/xen/domain.c | 8 +++----- xen/include/asm-ia64/vmx.h | 2 +- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/xen/arch/ia64/vmx/vmx_init.c b/xen/arch/ia64/vmx/vmx_init.c index 00366d397e..821ec7f623 100644 --- a/xen/arch/ia64/vmx/vmx_init.c +++ b/xen/arch/ia64/vmx/vmx_init.c @@ -436,7 +436,32 @@ int vmx_setup_platform(struct domain *d) return 0; } -void vmx_do_launch(struct vcpu *v) +void vmx_do_resume(struct vcpu *v) { + ioreq_t *p; + vmx_load_all_rr(v); + migrate_timer(&v->arch.arch_vmx.vtm.vtm_timer, v->processor); + + /* stolen from hvm_do_resume() in arch/x86/hvm/hvm.c */ + /* NB. Optimised for common case (p->state == STATE_IOREQ_NONE). */ + p = &get_vio(v->domain, v->vcpu_id)->vp_ioreq; + while (p->state != STATE_IOREQ_NONE) { + switch (p->state) { + case STATE_IORESP_READY: /* IORESP_READY -> NONE */ + vmx_io_assist(v); + break; + case STATE_IOREQ_READY: + case STATE_IOREQ_INPROCESS: + /* IOREQ_{READY,INPROCESS} -> IORESP_READY */ + wait_on_xen_event_channel(v->arch.arch_vmx.xen_port, + (p->state != STATE_IOREQ_READY) && + (p->state != STATE_IOREQ_INPROCESS)); + break; + default: + gdprintk(XENLOG_ERR, + "Weird HVM iorequest state %d.\n", p->state); + domain_crash_synchronous(); + } + } } diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index 08b642694e..97932d5b22 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -203,11 +203,9 @@ void schedule_tail(struct vcpu *prev) context_saved(prev); ia64_disable_vhpt_walker(); - if (VMX_DOMAIN(current)) { - vmx_do_launch(current); - migrate_timer(¤t->arch.arch_vmx.vtm.vtm_timer, - current->processor); - } else { + if (VMX_DOMAIN(current)) + vmx_do_resume(current); + else { if (VMX_DOMAIN(prev)) ia64_set_iva(&ia64_ivt); load_region_regs(current); diff --git a/xen/include/asm-ia64/vmx.h b/xen/include/asm-ia64/vmx.h index 0f03df6306..c6da04e6fc 100644 --- a/xen/include/asm-ia64/vmx.h +++ b/xen/include/asm-ia64/vmx.h @@ -34,7 +34,7 @@ extern int vmx_final_setup_guest(struct vcpu *v); extern void vmx_save_state(struct vcpu *v); extern void vmx_load_state(struct vcpu *v); extern int vmx_setup_platform(struct domain *d); -extern void vmx_do_launch(struct vcpu *v); +extern void vmx_do_resume(struct vcpu *v); extern void vmx_io_assist(struct vcpu *v); extern int ia64_hypercall (struct pt_regs *regs); extern void vmx_save_state(struct vcpu *v); -- 2.30.2